package pe.gob.mininter.dirandro.vaadin.panel.parte;

import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

import pe.gob.mininter.dirandro.model.Expediente;
import pe.gob.mininter.dirandro.model.NoIdentificado;
import pe.gob.mininter.dirandro.service.NoIdentificadoService;
import pe.gob.mininter.dirandro.util.Constante;
import pe.gob.mininter.dirandro.util.HarecUtil;
import pe.gob.mininter.dirandro.vaadin.dialogs.AlertDialog;
import pe.gob.mininter.dirandro.vaadin.util.ComboBoxLOVS;
import pe.gob.mininter.dirandro.vaadin.util.Injector;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Item;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.OptionGroup;
import com.vaadin.ui.Table;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;

public class PanelRegistroParteNoIdentificado extends CustomComponent implements ClickListener {

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
	
	@AutoGenerated
	private VerticalLayout mainLayout;
	@AutoGenerated
	private VerticalLayout pnlPrincipal1;
	@AutoGenerated
	private Table tblNoIdentidifacos;
	@AutoGenerated
	private HorizontalLayout horizontalLayout_2;
	@AutoGenerated
	private Button btnPNIGrabar;
	@AutoGenerated
	private TextField txtPNIEdad;
	@AutoGenerated
	private OptionGroup rbSexo;
	@AutoGenerated
	private ComboBoxLOVS cmbPNIOrientacionSexual;
	@AutoGenerated
	private HorizontalLayout horizontalLayout_1;
	@AutoGenerated
	private TextField txtPNIApellidos;
	@AutoGenerated
	private TextField txtPNINombres;
	@AutoGenerated
	private TextField txtPNIAlias;
	private static final long serialVersionUID = -4639683924066371051L;
	private final static Logger logger = Logger.getLogger(PanelRegistroParteNoIdentificado.class);
	private IndexedContainer container;
	
	private static final String COLUMN_ALIAS = "COLUMN_ALIAS";
	private static final String COLUMN_NOMBRES = "COLUMN_NOMBRES";
	private static final String COLUMN_APELLIDOS = "COLUMN_APELLIDOS";
	private static final String COLUMN_ORIENTACION_SEX = "COLUMN_ORIENTACION_SEX";
	private static final String COLUMN_EDAD = "COLUMN_EDAD";
	private static final String COLUMN_SEXO = "COLUMN_SEXO";
	private static final String COLUMN_NO_IDENTIFICADO = "COLUMN_NO_IDENTIFICADO";
	
	private Expediente expediente;
	private boolean inicializado=false;
	private NoIdentificadoService noIdentificadoService;
	private NoIdentificado noIdentificado;
	
	public PanelRegistroParteNoIdentificado() {
		buildMainLayout();
		setCompositionRoot(mainLayout);
		postConstruct();
	}
	
	@Override
	public void attach() {
		super.attach();
	}

	public void setExpediente(Expediente expediente) {
		this.expediente = expediente;
		postConstruct();
	}

	public void postConstruct() {
		if(expediente!=null && !expediente.esNuevo() && !inicializado){
			logger.debug("esto es postconstruct");
			noIdentificadoService = Injector.obtenerServicio(NoIdentificadoService.class);
			cmbPNIOrientacionSexual.setCodigoLista(Constante.LISTA.CODIGO.ORIENTACION_SEXUAL);
			cmbPNIOrientacionSexual.setInputPrompt("Orientación Sexual");
			cmbPNIOrientacionSexual.attach();
			
			cmbPNIOrientacionSexual.setVisible(false);
			rbSexo.addItem("M");
			rbSexo.addItem("F");
			
			containerTabla();
			btnPNIGrabar.addListener((ClickListener) this);
			inicializado=true;
			cargarNoIdentificados();
			limpiar();
		}
	}
	
	private void containerTabla() {
		logger.debug("containerTabla()");
		container = new IndexedContainer();
		container.addContainerProperty(COLUMN_ALIAS, String.class, null);
		container.addContainerProperty(COLUMN_NOMBRES, String.class, null);
		container.addContainerProperty(COLUMN_APELLIDOS, String.class, null);
		container.addContainerProperty(COLUMN_ORIENTACION_SEX, String.class, null);
		container.addContainerProperty(COLUMN_EDAD, String.class, null);
		container.addContainerProperty(COLUMN_SEXO, String.class, null);
		container.addContainerProperty(COLUMN_NO_IDENTIFICADO, NoIdentificado.class, null);
		
		tblNoIdentidifacos.setContainerDataSource(container);
		tblNoIdentidifacos.setColumnHeader(COLUMN_ALIAS,"Alias");
		tblNoIdentidifacos.setColumnHeader(COLUMN_NOMBRES, "Nombres");
		tblNoIdentidifacos.setColumnHeader(COLUMN_APELLIDOS, "Apellidos");
		tblNoIdentidifacos.setColumnHeader(COLUMN_ORIENTACION_SEX, "Orientación Sex.");
		tblNoIdentidifacos.setColumnHeader(COLUMN_SEXO, "Sexo");
		tblNoIdentidifacos.setColumnHeader(COLUMN_EDAD, "Edad");
		tblNoIdentidifacos.setVisibleColumns(new Object[] {COLUMN_ALIAS, COLUMN_NOMBRES, COLUMN_APELLIDOS, COLUMN_SEXO, COLUMN_EDAD });

		tblNoIdentidifacos.setColumnWidth(COLUMN_ALIAS, 200);
		tblNoIdentidifacos.setColumnWidth(COLUMN_NOMBRES, 200);
		tblNoIdentidifacos.setColumnWidth(COLUMN_APELLIDOS, 200);
		tblNoIdentidifacos.setColumnWidth(COLUMN_SEXO, 100);
		tblNoIdentidifacos.setColumnWidth(COLUMN_EDAD, 60);
		
		tblNoIdentidifacos.setSelectable(true);
		tblNoIdentidifacos.setImmediate(true);
		tblNoIdentidifacos.setNullSelectionAllowed(true);
		tblNoIdentidifacos.setNullSelectionItemId(null);
		
		tblNoIdentidifacos.addListener(new ValueChangeListener() {			 
			
			private static final long serialVersionUID = 6780877045656860061L;

			@Override
			public void valueChange(ValueChangeEvent event) {
				boolean esModoNuevo = tblNoIdentidifacos.getValue() == null;
				if(esModoNuevo){
					tblNoIdentidifacos.setValue(null);
					limpiar();
				}else {
					Item item = tblNoIdentidifacos.getItem(tblNoIdentidifacos.getValue());
					noIdentificado = (NoIdentificado)item.getItemProperty(COLUMN_NO_IDENTIFICADO).getValue(); 
					llenarCamposNoIdentificado();
				}
			}
		});
		
	}
	
	private void llenarCamposNoIdentificado(){
		if(noIdentificado!=null){
			txtPNIAlias.setValue(HarecUtil.nullToEmpty(noIdentificado.getAlias()));
			txtPNINombres.setValue(HarecUtil.nullToEmpty(noIdentificado.getNombres()));
			txtPNIApellidos.setValue(HarecUtil.nullToEmpty(noIdentificado.getApellidos()));
			txtPNIEdad.setValue(HarecUtil.nullToEmpty(noIdentificado.getEdadAprox()));
			cmbPNIOrientacionSexual.select(noIdentificado.getOrientacionSexual());
			rbSexo.setValue(HarecUtil.nullToEmpty(noIdentificado.getSexo()));
		}
	}
	
	private void cargarNoIdentificados() {
		
		container.removeAllItems();

		List<NoIdentificado> noIdentificados = noIdentificadoService.cargarDelExpediente(expediente);
		for (NoIdentificado noIdentificado : noIdentificados) {
			Item item = container.addItem(noIdentificado.getId());
			item.getItemProperty(COLUMN_ALIAS).setValue(noIdentificado.getAlias());
			item.getItemProperty(COLUMN_NOMBRES).setValue(noIdentificado.getNombres());
			item.getItemProperty(COLUMN_APELLIDOS).setValue(noIdentificado.getApellidos());
			item.getItemProperty(COLUMN_ORIENTACION_SEX).setValue(noIdentificado.getOrientacionSexual() != null ? noIdentificado.getOrientacionSexual().getNombre() : StringUtils.EMPTY);
			item.getItemProperty(COLUMN_EDAD).setValue(noIdentificado.getEdadAprox() != null ? ""+noIdentificado.getEdadAprox().intValue() : StringUtils.EMPTY);
			item.getItemProperty(COLUMN_NO_IDENTIFICADO).setValue(noIdentificado);
			item.getItemProperty(COLUMN_SEXO).setValue(noIdentificado.getSexo());
		}
	}

	@Override
	public void buttonClick(ClickEvent event) {
		if(event.getButton().equals(btnPNIGrabar)) {
			buttonClickBtnPNIGrabar();
		}
	}
	
	private void buttonClickBtnPNIGrabar() {
		
		noIdentificado.setAlias((String)txtPNIAlias.getValue());
		noIdentificado.setNombres((String)txtPNINombres.getValue());
		noIdentificado.setApellidos((String)txtPNIApellidos.getValue());
		if(cmbPNIOrientacionSexual.isVisible()){
			noIdentificado.setOrientacionSexual(cmbPNIOrientacionSexual.getValor());	
		}
		noIdentificado.setSexo( rbSexo.getValue()!= null ? rbSexo.getValue().toString() : StringUtils.EMPTY );
		noIdentificado.setEdadAprox(HarecUtil.toBigDecimal(txtPNIEdad.getValue())); 
		noIdentificado.setExpediente(expediente);
		
		AlertDialog alertDialog = null;
		if(noIdentificado.esNuevo()){
			noIdentificadoService.crear(noIdentificado);	
			alertDialog = new  AlertDialog("Registro de Persona no identificada", "Se ha registrado a la persona correctamente", "Aceptar", "400");
		}else{
			noIdentificadoService.actualizar(noIdentificado);
			alertDialog = new  AlertDialog("Registro de Persona no identificada", "Se ha actualizado a la persona correctamente", "Aceptar", "400");
		}
		getApplication().getMainWindow().addWindow(alertDialog);
		
		cargarNoIdentificados();
		limpiar();
		
	}

	private void limpiar() {
		txtPNIAlias.setValue(StringUtils.EMPTY);
		txtPNINombres.setValue(StringUtils.EMPTY);
		txtPNIApellidos.setValue(StringUtils.EMPTY);
		txtPNIEdad.setValue(StringUtils.EMPTY);
		cmbPNIOrientacionSexual.select(null);
		this.noIdentificado = new NoIdentificado();
	}

	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("100%");
		mainLayout.setHeight("-1px");
		mainLayout.setMargin(true);
		mainLayout.setSpacing(true);
		
		// top-level component properties
		setWidth("100.0%");
		setHeight("-1px");
		
		// pnlPrincipal1
		pnlPrincipal1 = buildPnlPrincipal1();
		mainLayout.addComponent(pnlPrincipal1);
		
		return mainLayout;
	}

	@AutoGenerated
	private VerticalLayout buildPnlPrincipal1() {
		// common part: create layout
		pnlPrincipal1 = new VerticalLayout();
		pnlPrincipal1.setImmediate(false);
		pnlPrincipal1.setWidth("-1px");
		pnlPrincipal1.setHeight("-1px");
		pnlPrincipal1.setMargin(false);
		pnlPrincipal1.setSpacing(true);
		
		// horizontalLayout_1
		horizontalLayout_1 = buildHorizontalLayout_1();
		pnlPrincipal1.addComponent(horizontalLayout_1);
		
		// horizontalLayout_2
		horizontalLayout_2 = buildHorizontalLayout_2();
		pnlPrincipal1.addComponent(horizontalLayout_2);
		
		// tblNoIdentidifacos
		tblNoIdentidifacos = new Table();
		tblNoIdentidifacos.setImmediate(false);
		tblNoIdentidifacos.setWidth("870px");
		tblNoIdentidifacos.setHeight("-1px");
		pnlPrincipal1.addComponent(tblNoIdentidifacos);
		
		return pnlPrincipal1;
	}

	@AutoGenerated
	private HorizontalLayout buildHorizontalLayout_1() {
		// common part: create layout
		horizontalLayout_1 = new HorizontalLayout();
		horizontalLayout_1.setImmediate(false);
		horizontalLayout_1.setWidth("-1px");
		horizontalLayout_1.setHeight("-1px");
		horizontalLayout_1.setMargin(false);
		horizontalLayout_1.setSpacing(true);
		
		// txtPNIAlias
		txtPNIAlias = new TextField();
		txtPNIAlias.setCaption("Alias");
		txtPNIAlias.setImmediate(false);
		txtPNIAlias.setWidth("250px");
		txtPNIAlias.setHeight("-1px");
		txtPNIAlias.setRequired(true);
		txtPNIAlias.setInputPrompt("Alias del presunto implicado");
		horizontalLayout_1.addComponent(txtPNIAlias);
		
		// txtPNINombres
		txtPNINombres = new TextField();
		txtPNINombres.setCaption("Nombres");
		txtPNINombres.setImmediate(false);
		txtPNINombres.setWidth("250px");
		txtPNINombres.setHeight("-1px");
		txtPNINombres.setInputPrompt("Presuntos nombres del detenido");
		horizontalLayout_1.addComponent(txtPNINombres);
		
		// txtPNIApellidos
		txtPNIApellidos = new TextField();
		txtPNIApellidos.setCaption("Apellidos");
		txtPNIApellidos.setImmediate(false);
		txtPNIApellidos.setWidth("250px");
		txtPNIApellidos.setHeight("-1px");
		txtPNIApellidos.setInputPrompt("Presuntos Apellidos del detenido");
		horizontalLayout_1.addComponent(txtPNIApellidos);
		
		return horizontalLayout_1;
	}

	@AutoGenerated
	private HorizontalLayout buildHorizontalLayout_2() {
		// common part: create layout
		horizontalLayout_2 = new HorizontalLayout();
		horizontalLayout_2.setImmediate(false);
		horizontalLayout_2.setWidth("-1px");
		horizontalLayout_2.setHeight("-1px");
		horizontalLayout_2.setMargin(false);
		horizontalLayout_2.setSpacing(true);
		
		// cmbPNIOrientacionSexual
		cmbPNIOrientacionSexual = new ComboBoxLOVS();
		cmbPNIOrientacionSexual.setCaption("Orientación Sexual");
		cmbPNIOrientacionSexual.setImmediate(false);
		cmbPNIOrientacionSexual.setWidth("-1px");
		cmbPNIOrientacionSexual.setHeight("-1px");
		horizontalLayout_2.addComponent(cmbPNIOrientacionSexual);
		
		// rbSexo
		rbSexo = new OptionGroup();
		rbSexo.setStyleName("horizontal");
		rbSexo.setCaption("Sexo");
		rbSexo.setImmediate(false);
		rbSexo.setWidth("100px");
		rbSexo.setHeight("25px");
		horizontalLayout_2.addComponent(rbSexo);
		
		// txtPNIEdad
		txtPNIEdad = new TextField();
		txtPNIEdad.setCaption("Edad Aproximada");
		txtPNIEdad.setImmediate(false);
		txtPNIEdad.setWidth("-1px");
		txtPNIEdad.setHeight("-1px");
		txtPNIEdad.setRequired(true);
		txtPNIEdad.setInputPrompt("Edad Aproximada");
		horizontalLayout_2.addComponent(txtPNIEdad);
		
		// btnPNIGrabar
		btnPNIGrabar = new Button();
		btnPNIGrabar.setCaption("Grabar");
		btnPNIGrabar.setImmediate(true);
		btnPNIGrabar.setWidth("-1px");
		btnPNIGrabar.setHeight("-1px");
		horizontalLayout_2.addComponent(btnPNIGrabar);
		horizontalLayout_2.setComponentAlignment(btnPNIGrabar,
				new Alignment(10));
		
		return horizontalLayout_2;
	}

}
